﻿/**
 * @file   FITKVolumeMeshingParameter.h
 * @brief 几何网格区域尺寸生成器
 * @author fulipeng (fulipengqd@yeah.net)
 * @date 2024-12-17
 */
#ifndef _FITKVOLUME_MESHING_PARAMETR__H___
#define _FITKVOLUME_MESHING_PARAMETR__H___

#include "FITKInterfaceMeshGenAPI.h"
#include "FITKGeometryMeshSize.h"

#include <QObject>
#include <QMetaEnum>
namespace Interface
{
    /**
     * @brief 体网格划分参数抽象类
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-12-17
     */
    class FITKInterfaceMeshGenAPI FITKVolumeMeshingParameter : public Core::FITKAbstractDataObject
    {
        Q_OBJECT;
    public:
        enum ElementType
        {
            Regular,
            Orthogonal,
            Cartesian,
        };
        Q_ENUM(ElementType)
    public:
        /**
         * @brief Construct a new FITKVolumeMeshingParameter object
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        explicit FITKVolumeMeshingParameter() = default;
        /**
         * @brief Destroy the FITKVolumeMeshingParameter object
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        virtual ~FITKVolumeMeshingParameter() = default;

        /**
         * @brief       设置全局网格尺寸
         * @param gSize 全局网格尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        void setGlobalMeshSize(double gSize);
        /**
         * @brief   获取全局网格尺寸
         * @return  全局网格尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        double getGlobalMeshSize();

        /**
         * @brief       设置最大网格尺寸
         * @param size  全局网格尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        void setMaxMeshSize(double size);
        /**
         * @brief   获取最大网格尺寸
         * @return  全局网格尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        double getMaxMeshSize();

        /**
         * @brief       设置最小网格尺寸
         * @param size  最小网格尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        void setMinMeshSize(double size);
        /**
         * @brief   获取最小网格尺寸
         * @return  最小网格尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        double getMinMeshSize();

        /**
         * @brief   设置最大线程数
         * @param   numberThreads   最大线程数
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        void setMaxNumberOfThreads(int numberThreads);
        /**
         * @brief   获取最大线程数
         * @return  最大线程数
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        int getMaxNumberOfThreads();

        /**
         * @brief       设置单元类型
         @param eleType 单元类型
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        bool setElementType(ElementType eleType);
        /**
         * @brief   获取单元类型
         * @return  单元类型
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        ElementType getElementType();


    protected:

        /**
         * @brief   单元类型
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        ElementType _eleType = ElementType::Regular;

        /**
         * @brief   全局网格尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        double _globalMeshSize = 0;

        /**
         * @brief   网格最大尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        double _maxMeshSize = 0;

        /**
         * @brief   网格最小尺寸
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        double _minMeshSize = 0;

        /**
         * @brief   最大线程数
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-12-17
         */
        int _maxNumberThreads = 1;
    };

}


#endif
